﻿using System;
using System.Collections.Generic;
using System.Text;
using Gencode.Common.SQL;
using Gencode.PrsCommon.App;
using System.Data;

namespace Gencode.PrsCommon.Data.Dienst
{
    public class DienstData
    {
        /// <summary>
        /// Saves a dienst in a specific plan on a specific day
        /// </summary>
        /// <param name="planID"></param>
        /// <param name="prsID"></param>
        /// <param name="abteilungID"></param>
        /// <param name="date"></param>
        /// <param name="dienstID"></param>
        public static void SaveDienstInPlan(int planID, int prsID, int abteilungID, string date, int dienstID)
        {
            Querry query = new Querry();
            query.SetSTPName("set_updsetdienst");
            query.AddParameter("@planid", planID);
            query.AddParameter("@prsid", prsID);
            query.AddParameter("@abteilungid", abteilungID);
            query.AddParameter("@datum", DateUtil.ConvertDateToSQL(date));
            query.AddParameter("@dienstid", dienstID);
            query.Execute(false);
        }

        /// <summary>
        /// Saves a color in a specific plan on a specific day
        /// </summary>
        /// <param name="planID"></param>
        /// <param name="prsID"></param>
        /// <param name="abteilungID"></param>
        /// <param name="date"></param>
        /// <param name="argb"></param>
        public static void SaveColorInPlan(int planID, int prsID, int abteilungID, string date, int argb)
        {
            Querry query = new Querry();
            query.SetSTPName("set_updsetcolor");
            query.AddParameter("@planid", planID);
            query.AddParameter("@prsid", prsID);
            query.AddParameter("@abteilungid", abteilungID);
            query.AddParameter("@datum", DateUtil.ConvertDateToSQL(date));
            query.AddParameter("@argb", argb);
            query.Execute(false);
        }


		/// <summary>
		/// Initializes all Dienstserien in Database for a plan
		/// </summary>
		/// <param name="planID">planid</param>
		public static void InitDienstSerie(int planID)
		{
			Querry query = new Querry();
			query.SetSTPName("get_plandienstserie");
			query.AddParameter("@planid", planID);
			DataView dv = query.ExecuteForDataView();

			int prsid, abteilungid, dienstid, tag, tage;
			string von, bis, planvon, planbis, typ;
			int m, y;

			foreach (DataRowView row in dv)
			{
				prsid = int.Parse(row["prsid"].ToString());
				abteilungid = int.Parse(row["abteilungid"].ToString());
				dienstid = int.Parse(row["dienstid"].ToString());
				von = DateUtil.ConvertSqlToDate(row["von"].ToString());
				bis = DateUtil.ConvertSqlToDate(row["bis"].ToString());
				typ = row["typ"].ToString();
				tag = int.Parse(row["tag"].ToString());
				planvon = DateUtil.ConvertSqlToDate(row["planvon"].ToString());
				planbis = DateUtil.ConvertSqlToDate(row["planbis"].ToString());

				switch (typ)
				{
					//Wöchentlich
					case "W":
						DayOfWeek dow = SetDOW(tag);
						tage = DateUtil.ToInt(planbis) - DateUtil.ToInt(planvon);
						m = int.Parse(DateUtil.GetMonth(planvon));
						y = int.Parse(DateUtil.GetYear(planvon));

						for (int c = 0; c < tage; c++)
						{
							DateTime dt = new DateTime(y, m, c + 1);
							if (dt.DayOfWeek == dow)
							{
								if (DateUtil.ToInt(von) <= DateUtil.ToInt(dt.ToShortDateString()) &&
									DateUtil.ToInt(bis) >= DateUtil.ToInt(dt.ToShortDateString()))
									SaveDienstInPlan(planID, prsid, abteilungid, DateUtil.ConvertDateToSQL(dt.ToShortDateString()), dienstid);
							}
						}

						break;

					//Monatlich
					case "M":
						m = int.Parse(DateUtil.GetMonth(planvon));
						y = int.Parse(DateUtil.GetYear(planvon));
						DateTime dte = new DateTime(y, m, tag);

						if (DateUtil.ToInt(von) <= DateUtil.ToInt(dte.ToShortDateString()) && 
							DateUtil.ToInt(bis) >= DateUtil.ToInt(dte.ToShortDateString()))
							SaveDienstInPlan(planID, prsid, abteilungid, DateUtil.ConvertDateToSQL(dte.ToShortDateString()), dienstid);
						break;
				}
			}
		}

		private static DayOfWeek SetDOW(int day)
		{
			DayOfWeek tmpDay;

			switch (day)
			{
				case 1:
					tmpDay = DayOfWeek.Monday;
					break;
				case 2:
					tmpDay = DayOfWeek.Tuesday;
					break;
				case 3:
					tmpDay = DayOfWeek.Wednesday;
					break;
				case 4:
					tmpDay = DayOfWeek.Thursday;
					break;
				case 5:
					tmpDay = DayOfWeek.Friday;
					break;
				case 6:
					tmpDay = DayOfWeek.Saturday;
					break;
				case 7:
					tmpDay = DayOfWeek.Sunday;
					break;
				default:
					tmpDay = DayOfWeek.Monday;
					break;
			}
			return tmpDay;
		}

		/// <summary>
		/// Creates a DataView with the Dienstschema of a abteilung, [dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]
		/// </summary>
		/// <param name="schemaid">schemaid</param>
		/// <param name="abteilungid">abteilungid</param>
		/// <param name="mandid">mandid</param>
		/// <returns>[dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]</returns>
		public static DataView GetDienstSchema(int schemaid, int abteilungid, string mandid)
		{
			Querry stp = new Querry();

            stp.SetSTPName("get_dienstschema");

            stp.AddParameter("@schemaid", schemaid);
            stp.AddParameter("@abteilungid", abteilungid);

			return stp.ExecuteForDataView();
		}

		/// <summary>
		/// [dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]
		/// </summary>
		/// <param name="schemaid">schemaid</param>
		/// <param name="abteilungid">abteilungid</param>
		/// <returns>[dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]</returns>
		public static DataView GetDienstNotInSchema(int schemaid, int abteilungid)
		{

			Querry stp = new Querry();

			stp.SetSTPName("get_dienstnotinschema");
			stp.AddParameter("@schemaid", schemaid);
			stp.AddParameter("@abteilungid", abteilungid);

			return stp.ExecuteForDataView();
		}

		public static void AddDienstToSchema(int dienstid, int schemaid, int abteilungid, int einsatzprotag)
		{
			SimpleQuerry.Execute("insert into DienstSchema (SchemaID,AbteilungID,DienstID,EinsatzProTag,Gerechnet) values ( " +
				schemaid + "," + abteilungid + "," + dienstid + "," + einsatzprotag + ",0)");
		}

		public static void DeleteDienstFromSchema(int dienstid, int schemaid, int abteilungid)
		{
			SimpleQuerry.Execute("delete from DienstSchema where SchemaID = " + schemaid
				+ " and AbteilungID = " + abteilungid
				+ " and DienstID = " + dienstid);
		}

		/// <summary>
		/// Creates a DataView with the Dienstschema of all abteilungen, [dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]
		/// </summary>
		/// <param name="schemaid">schemaid</param>
		/// <param name="mandid">mandid</param>
		/// <returns>[dienstid,gerechnet,einsatzprotag,dienstname,kurztext,langtext,abteilungid,abteilungname]</returns>
		public static DataView GetDienstSchema(int schemaid, string mandid)
		{
			return GetDienstSchema(schemaid, 0, mandid);
		}

		/// <summary>
		/// [DienstID,Name,Gerechnet,Typ,RGB,GanzerTag,Kurztext,Langtext]
		/// </summary>
		/// <param name="mandid">mandid</param>
		/// <param name="all">false = only active</param>
		/// <param name="addEmptyRow">add empty row at top</param>
		/// <returns>[DienstID,Name,Gerechnet,Typ,RGB,GanzerTag,Kurztext,Langtext]</returns>
		public static DataView GetDienste(string mandid, bool all, bool addEmptyRow)
		{
			string str = "select DienstID,Name,Gerechnet,Typ,RGB,GanzerTag,Kurztext,Langtext from Dienst, Beschreibung b where Status = 0 and Dienst.BeschrID = b.BeschrID order by DienstID";
			if (all)
				str = "select DienstID,Name,Gerechnet,Typ,RGB,GanzerTag,Kurztext,Langtext from Dienst, Beschreibung b where Dienst.BeschrID = b.BeschrID order by DienstID";

			DataView dv = SimpleQuerry.ExecuteForDataView(str);

			if (addEmptyRow)
			{
				DataRow row = dv.Table.NewRow();
				dv.Table.Rows.InsertAt(row, 0);
			}

			return dv;
		}

		/// <summary>
		/// Creates a DataView with Dienste. Set dienstID = 0 for all Dienste. Anzeigename,DienstID,Name,Kuzrtext,RGB
		/// </summary>
		/// <returns>Anzeigename,DienstID,Name,Kuzrtext,RGB</returns>
		public static DataView GetDienste(string mandid, int dienstID)
		{
			Querry querry = new Querry();
			querry.SetSTPName("get_dienstlisting");
			querry.AddParameter("@mandid", mandid);
			querry.AddParameter("@dienstid", dienstID);

			return querry.ExecuteForDataView();
		}

		/// <summary>
		/// Creates a DataView with all Dienste. Anzeigename,DienstID,Name,Kuzrtext,RGB
		/// </summary>
		/// <returns>Anzeigename,DienstID,Name,Kuzrtext,RGB</returns>
		public static DataView GetDienste(string mandid)
		{
			return GetDienste(mandid, 0);
		}

		/// <summary>
		/// Creates a DataView with all Dienste. Anzeigename,DienstID,Name,Kuzrtext,RGB
		/// </summary>
		/// <param name="mandid">Mandant</param>
		/// <param name="addemptyrow">Add empty row at top?</param>
		/// <returns>Anzeigename,DienstID,Name,Kuzrtext,RGB</returns>
		public static DataView GetDienste(string mandid, bool addemptyrow)
		{
			DataView dv = GetDienste(mandid, 0);

			if (addemptyrow)
			{
				//create empty row
				DataRow row = dv.Table.NewRow();
				row[0] = ""; //Anzeigename
				row[1] = "0"; //DienstID
				row[2] = ""; //Name
				row[3] = ""; //Kurztext
				row[4] = "0"; //RGB

				dv.Table.Rows.InsertAt(row, 0);
			}

			return dv;
		}

		/// <summary>
		/// [wert,textwert]
		/// </summary>
		/// <param name="mandid">mandid</param>
		/// <param name="addEmptyRow">add empty row at top</param>
		/// <returns>[wert,textwert]</returns>
		public static DataView GetDienstTyp(string mandid, bool addEmptyRow)
		{
			DataView dv = SimpleQuerry.ExecuteForDataView("select wert, textwert from Options where Options.typ = 'Diensttyp' order by wert");

			if (addEmptyRow)
			{
				DataRow row = dv.Table.NewRow();
				dv.Table.Rows.InsertAt(row, 0);
			}

			return dv;
		}

		/// <summary>
		/// [dienstzeitid,dienstid,von,bis,typ,datumvon,datumbis,abteilungszeit]
		/// </summary>
		/// <param name="dienstid">dienstid</param>
		/// <returns>[dienstzeitid,dienstid,von,bis,typ]</returns>
		public static DataView GetDienstZeiten(int dienstid)
		{
			Querry qu = new Querry("get_dienstzeiten");
			qu.AddParameter("@dienstid", dienstid);
			return qu.ExecuteForDataView(); 
		}

		public static void DeleteDienstZeit(int dienstzeitid)
		{
			SimpleQuerry.Execute("delete from DienstZeit where DienstZeitID = " + dienstzeitid);
		}

		public static void DeactivateDienst(int dienstid)
		{
			Querry stp = new Querry();

			// Dienst wird nicht gelöscht sondern deaktiviert
			stp.SetSTPName("del_dienst");

			stp.AddParameter("@dienstid", dienstid);

			stp.Execute();
		}

		public static void UpdateDienst(int dienstid, string name, string kurztext, string beschreibung, int gerechnet, int rgb, int diensttyp, int ganzertag)
		{
			Querry stp = new Querry();

			stp.SetSTPName("upd_dienst");

			stp.AddParameter("@dienstid", dienstid);
			stp.AddParameter("@dienstname", name);
			stp.AddParameter("@kurztext", kurztext);
			stp.AddParameter("@beschreibung", beschreibung);
			stp.AddParameter("@gerechnet", gerechnet);
			stp.AddParameter("@RGB", rgb);
			stp.AddParameter("@ColorName", "");
			stp.AddParameter("@typ", diensttyp);
			stp.AddParameter("@GanzerTag", ganzertag);

			stp.Execute(true);
		}

		public static void SaveDienst(string name, string kurztext, string beschreibung, int gerechnet, int rgb, int diensttyp, int ganzertag, string mandid)
		{
			Querry stp = new Querry();

			stp.SetSTPName("set_neudienst");

			stp.AddParameter("@mandid", mandid);
			stp.AddParameter("@dienstname", name);
			stp.AddParameter("@kurztext", kurztext);
			stp.AddParameter("@beschreibung", beschreibung);
			stp.AddParameter("@gerechnet", gerechnet);

			stp.AddParameter("@RGB", rgb);
			stp.AddParameter("@ColorName", "");

			stp.AddParameter("@typ", diensttyp);
			stp.AddParameter("@GanzerTag", ganzertag);

			stp.Execute(true);
		}

		/// <summary>
		/// [Name,PrsID,DienstID,AbteilungID,Tag,Typ,Von,bis]
		/// </summary>
		/// <param name="mandid"></param>
		/// <returns>[Name,PrsID,DienstID,AbteilungID,Tag,Typ,Von,bis]</returns>
		public static DataView GetDienstSerien(string mandid)
		{
			return SimpleQuerry.ExecuteForDataView("select Name,PrsID,d.DienstID,AbteilungID,Tag,DienstSerie.Typ,Von,bis from DienstSerie, Dienst d where DienstSerie.DienstID = d.DienstID and bis >= GETDATE() and DienstSerie.mandid = '" + mandid +"'");
		}

		/// <summary>
		/// [Name,PrsID,DienstID,AbteilungID,Tag,Typ,Von,bis]
		/// </summary>
		/// <param name="mandid"></param>
		/// <returns>[Name,PrsID,DienstID,AbteilungID,Tag,Typ,Von,bis]</returns>
		public static DataView GetDienstSerien(string mandid, bool addEmptyRow)
		{
			DataView dv = GetDienstSerien(mandid);
			
			if (addEmptyRow)
			{
				DataRow row = dv.Table.NewRow();
				dv.Table.Rows.InsertAt(row, 0);
			}

			return dv;
		}

		public static void UpdateDienstSerie(int prsid, int dienstid, int abteilungid, int tag, string typ, string von, string bis,
			int old_prsid, int old_abteilungid, int old_dienstid, int old_tag, string old_von, string old_bis, string old_typ)
		{
			Querry stp = new Querry();
			stp.SetSTPName("upd_dienstserie");

			stp.AddParameter("@OldPrsID", old_prsid);
			stp.AddParameter("@Olddienstid", old_dienstid);
			stp.AddParameter("@OldAbteilungID", old_abteilungid);
			stp.AddParameter("@OldTag", old_tag);
			stp.AddParameter("@OldTyp", old_typ);
			stp.AddParameter("@OldVon", DateUtil.ConvertDateToSQL(old_von));
			stp.AddParameter("@OldBis", DateUtil.ConvertDateToSQL(old_bis));

			stp.AddParameter("@PrsID", prsid);
			stp.AddParameter("@dienstid", dienstid);
			stp.AddParameter("@AbteilungID", abteilungid);
			stp.AddParameter("@Tag", Convert.ToInt32(tag));
			stp.AddParameter("@Typ", typ);
			stp.AddParameter("@Von", DateUtil.ConvertDateToSQL(von));
			stp.AddParameter("@Bis", DateUtil.ConvertDateToSQL(bis));

			stp.Execute(true);
		}

		public static void SaveDienstSerie(int prsid, int dienstid, int abteilungid, int tag, string typ, string von, string bis)
		{
			Querry stp = new Querry();

			stp.SetSTPName("set_dienstserie");

			stp.AddParameter("@PrsID", prsid);
			stp.AddParameter("@dienstid", dienstid);
			stp.AddParameter("@AbteilungID", abteilungid);
			stp.AddParameter("@Tag", tag);
			stp.AddParameter("@Typ", typ);
			stp.AddParameter("@Von", DateUtil.ConvertDateToSQL(von));
			stp.AddParameter("@Bis", DateUtil.ConvertDateToSQL(bis));

			stp.Execute(true);
		}

        //public static bool CheckIfEnoughDienstInDay(int dienstid, int planid, int abteilungid)
        //{
        //    DataView dv = SimpleQuerry.ExecuteForDataView("
        //}
    }
}
